home *** CD-ROM | disk | FTP | other *** search
/ .net 2002 March / DotNetMagazine-Issue107-Coverdisc-NET107-02-03-PCMac.bin / pc / PC Software / free_browsing / DavesQckSearchDbar3-14 / dqsd.exe / calendar.js < prev    next >
Text File  |  2002-07-15  |  11KB  |  360 lines

  1. /**
  2.  * script to display a popup calendar
  3.  * added by Sidney Chong (sidney@gamebox.net) 12/12/2001
  4.  * modified by Sidney Chong (sidney@gamebox.net) 15/01/2002
  5.  *  - added display of events (eg holidays) specified
  6.  *    in a file referenced by the var 'eventsfileurl'
  7.  * modified by Sidney Chong (sidney@gamebox.net) 16/01/2002
  8.  *  - changed event month to run from 1-12 instead of 0-11
  9.  *  - assume event date to be recurring if month or year attribute
  10.  *    is not specified.
  11.  * modified by Monty Scroggins  31/03/2002
  12.  *  - added support for a local events file with referenced by
  13.  *    a the var 'localeventsfileurl'
  14.  * modified by Neel Doshi 31/03/2002
  15.  *  - configured the calendar to use the stylesheet
  16.  *  - fixed the bug where "today" was not being highlighted if today is Sunday
  17.  * $Revision: 1.9 $
  18.  * $Date: 2002/07/12 11:56:38 $
  19.  *
  20.  * TODO:
  21.  *  - add ability to distingush b/w different kind of events
  22.  *  - add ability to input events directly from search box
  23.  */
  24.  
  25.  
  26. var ents = null;
  27. var lents = null;
  28.  
  29. function loadeventslist()
  30. {
  31.   try
  32.   {
  33.     document.write("<xml id='eventslist' src='" + eventsfileurl + "'></xml>");
  34.     ents = document.all("eventslist").selectSingleNode("events");
  35.   }
  36.   catch (ex) {}
  37. }
  38.  
  39. loadeventslist();
  40.  
  41. function loadlocaleventslist()
  42. {
  43.   try
  44.   {
  45.     document.write("<xml id='localeventslist' src='" + localeventsfileurl + "'></xml>");
  46.     lents = document.all("localeventslist").selectSingleNode("events");
  47.   }
  48.   catch (ex) {}
  49. }
  50.  
  51. loadlocaleventslist();
  52.  
  53. function yhocal(dat)
  54. {
  55.   // adjust for the local time zone
  56.   dat = dat - (new Date()).getTimezoneOffset() * 1000 * 60;
  57.  
  58.   // round down to closest day (in minutes)
  59.   dat = Math.floor(dat / 60 / 60 / 24 / 1000) * 60 * 60 * 24;
  60.   openNamedSearchWindow("http://calendar.yahoo.com/srt:0/?v=0&t=" + dat, "dqsdcal");
  61. }
  62.  
  63. function msncal(dat)
  64. {
  65.   var dobj = new Date(dat);
  66.   var yy = dobj.getYear();
  67.   if (yy < 100) yy += 1900;
  68.   openNamedSearchWindow("http://calendar.msn.com/calendar/isapi.dll?calendarView=day&day=" + dobj.getDate() + "&month=" + (dobj.getMonth()+1) + "&year=" + yy, "dqsdcal");
  69. }
  70.  
  71. function nsccal(dat)
  72. {
  73.   var dobj = new Date(dat);
  74.   var yy = dobj.getYear();
  75.   if (yy < 100) yy += 1900;
  76.   openNamedSearchWindow("http://calendar.netscape.com/cgi-bin/gx.cgi/AppLogic+DayGridView?_Date=" + (dobj.getMonth() + 1) + "/" + dobj.getDate() + "/" + yy, "dqsdcal");
  77. }
  78.  
  79. function aolcal(dat)
  80. {
  81.   var dobj = new Date(dat);
  82.   var yy = dobj.getYear();
  83.   if (yy < 100) yy += 1900;
  84.   openNamedSearchWindow("http://calendar.aol.com/cgi-bin/gx.cgi/AppLogic+DayGridView?_Date=" + (dobj.getMonth() + 1) + "/" + dobj.getDate() + "/" + yy, "dqsdcal");
  85. }
  86.  
  87. function mycal(dat)
  88. {
  89.   var dobj = new Date(dat);
  90.   var yy = dobj.getYear();
  91.   if (yy < 100) yy += 1900;
  92.   openNamedSearchWindow("http://www.mycalendar.com/?act=thisday&curdate=" + (dobj.getMonth() + 1) + "/" + dobj.getDate() + "/" + yy, "dqsdcal");
  93. }
  94.  
  95. function evcal(dat)
  96. {
  97.   var dobj = new Date(dat);
  98.   var yy = dobj.getYear();
  99.   if (yy < 100) yy += 1900;
  100.   openNamedSearchWindow("http://www.evite.com/welcome?date=" + (dobj.getMonth() + 1) + "%2F" + dobj.getDate() + "%2F" + yy, "dqsdcal");
  101. }
  102.  
  103. function outlook(dat)
  104. {
  105.   // TODO - find out how to open at a particular date
  106.   openDocument("outlook:calendar");
  107. }
  108.  
  109. //vars used by the calendar script
  110. var DAYS_OF_WEEK = 7;    // "constant" for number of days in a week
  111. var DAYS_OF_MONTH = 31;    // "constant" for number of days in a month
  112.  
  113. var Calendar = new Date(); //stores the date the user is looking at
  114. var Today = new Date(); // stores the date marked as today
  115. var popcal = null;
  116.  
  117. function showcal()
  118. {
  119.  
  120.   if (!dopopup || !cal)
  121.     return true;
  122.  
  123.   if (popcal == null)
  124.   {
  125.     popcal = window.createPopup();
  126.     popcal.document.body.innerHTML = buildcal();
  127.     popcal.document.body.className="cal";
  128.   }
  129.   else if (Today.getDate() != (new Date()).getDate())
  130.   {
  131.     popcal.document.body.innerHTML = buildcal();
  132.   }
  133.   popcal.show(document.body.clientWidth - calwidth, -calheight, calwidth, calheight, document.body);
  134.   return false;
  135. }
  136.  
  137. calupdatetimer = null;
  138.  
  139. function movecal(nMths)
  140. {
  141.   Calendar.setMonth(Calendar.getMonth()+nMths);
  142.   popcal.document.all["calhead"].innerHTML = buildcalheader();
  143.   if (calupdatetimer == null)
  144.     calupdatetimer = setTimeout("updatecal()", 0);
  145. }
  146.  
  147. function updatecal()
  148. {
  149.   calupdatetimer = null;
  150.   popcal.document.body.innerHTML = buildcal();
  151. }
  152.  
  153. function opencal(d)
  154. {
  155.   if (defaultcal)
  156.   {
  157.     if (popcal)
  158.       popcal.hide();
  159.     eval(defaultcal + '(' + d + ')');
  160.   }
  161. }
  162.  
  163. function buildcalhtmlhead()
  164. {
  165.   return '<table class=cal width=100% height=100% cellpadding=0 cellspacing=0 border=0><tr><td><style>' + convertStylesToInline() + '</style>';
  166. }
  167.  
  168. function buildcalheader()
  169. {
  170.   return getMonthName(Calendar.getMonth()+1)  + ' ' + Calendar.getFullYear();
  171. }
  172.  
  173. function buildcal()
  174. {
  175.   var year = Calendar.getFullYear();  // Returns year in 4 digits
  176.   var month = Calendar.getMonth();    // Returns month (0-11)
  177.  
  178.   Today = new Date();
  179.   var weekday = -1;
  180.  
  181.   if (Today.getMonth() == Calendar.getMonth() && Today.getYear() == Calendar.getYear())
  182.     weekday = Today.getDay();
  183.  
  184.   var cal;    // Used for printing
  185.  
  186.   Calendar.setDate(1);    // Start the calendar day at '1'
  187.  
  188.   var TR_start = '<tr>';
  189.   var TR_end = '</tr>';
  190.   var day_start = '<td width=14.2857% class=caldow>';
  191.   var day_end = '</td>';
  192.  
  193.   function eventday_start(d, ttl)
  194.   {
  195.     return '<td class=caleventday' +
  196.       (defaultcal ? ' onmouseover=this.className="caleventdayhigh" onmouseout=this.className="caleventday" onmouseup=this.className="caleventday";parent.opencal(' + d + ');' : ' ') +
  197.       ' title="' + ttl + '">';
  198.   }
  199.   var eventday_end   = '</td>';
  200.  
  201.   function todayevent_start(d, ttl)
  202.   {
  203.     return '<td class=caltodayevent' +
  204.       (defaultcal ? ' onmouseover=this.className="caltodayeventhigh" onmouseout=this.className="caltodayevent" onmouseup=this.className="caltodayevent";parent.opencal(' + d + ');' : ' ') +
  205.       ' title="' + ttl + '"' + '>';
  206.   }
  207.   var todayevent_end   = '</td>';
  208.  
  209.   function today_start(d)
  210.   {
  211.     return '<td class=caltoday' +
  212.         (defaultcal ? ' onmouseover=this.className="caltodayhigh" onmouseout=this.className="caltoday" onmouseup=this.className="caltoday";parent.opencal(' + d + ');' : ' ') + '>';
  213.   }
  214.   var today_end   = '</td>';
  215.  
  216.   function gray_start(d)
  217.   {
  218.      return '<td class=calgray' +
  219.          (defaultcal ? ' onmouseover=this.className="calgrayhigh" onmouseout=this.className="calgray" onmouseup=this.className="calgray";parent.opencal(' + d + ');' : ' ') + '>';
  220.   }
  221.   var gray_end   = '</td>';
  222.  
  223.   function TD_start(d)
  224.   {
  225.     return '<td class=calday' +
  226.         (defaultcal ? ' onmouseover=this.className="caldayhigh" onmouseout=this.className="calday" onmouseup=this.className="calday";parent.opencal(' + d + ');' : ' ') + '>';
  227.   }
  228.   var TD_end = '</td>';
  229.  
  230.   cal = buildcalhtmlhead();
  231.  
  232.   cal += '<table width=100% height=100% border=0 cellspacing=0 cellpadding=0><tr>';
  233.   cal += '<td colspan=7><table width=100% height=100% border=0 cellspacing=0 cellpadding=0><tr>';
  234.   cal += '<td><table align=left height=100% border=0 cellspacing=0 cellpadding=0><tr>';
  235.   cal += '<td class=calnavyear width=0 title="' + local(PREV_YEAR) + '" ' +
  236.          ' onmouseup="parent.movecal(-12);return false;" ' +
  237.          ' onmouseover=this.className="calnavyearhigh" ' +
  238.          ' onmouseout=this.className="calnavyear" > « </td>';
  239.   cal += '<td class=calnavmonth width=0 title="' + local(PREV_MONTH) + '" ' +
  240.          ' onmouseup="parent.movecal(-1);return false;" ' +
  241.          ' onmouseover=this.className="calnavmonthhigh" ' +
  242.          ' onmouseout=this.className="calnavmonth" > ‹ </td></tr></table></td>';
  243.  
  244.   if (weekday < 0)
  245.   {
  246.     cal += '<td id=calhead class=calmonth title="' + local(GO_TO_TODAY) + '" ' +
  247.       ' onmouseup="parent.Calendar=new Date();parent.movecal(0);" ' +
  248.       ' onmouseover=this.className="calmonthhigh" ' +
  249.       ' onmouseout=this.className="calmonth" >';
  250.   }
  251.   else
  252.   {
  253.     cal += '<td id=calhead class=calmonth colspan=' + (DAYS_OF_WEEK - 2) + '>';
  254.   }
  255.  
  256.   cal += buildcalheader();
  257.  
  258.   cal += '</td>';
  259.   cal += '<td><table align=RIGHT height=100% border=0 cellspacing=0 cellpadding=0><tr>';
  260.   cal += '<td class=calnavmonth width=0 title="' + local(NEXT_MONTH) + '" ' +
  261.          ' onmouseup="parent.movecal(+1);return false;" ' +
  262.          ' onmouseover=this.className="calnavmonthhigh" ' +
  263.          ' onmouseout=this.className="calnavmonth" > › </td>';
  264.   cal += '<td class=calnavyear width=0 title="' + local(NEXT_YEAR) + '" ' +
  265.          ' onmouseup="parent.movecal(+12);return false;" ' +
  266.          ' onmouseover=this.className="calnavyearhigh" ' +
  267.          ' onmouseout=this.className="calnavyear" > » </td></tr></table></td>';
  268.   cal += '</td></tr></table>';
  269.   cal += TR_end + TR_start;
  270.  
  271.   //printing day labels
  272.   for(index=0; index < DAYS_OF_WEEK; index++)
  273.   {
  274.     cal += day_start;
  275.     cal += getDayName(index+7+1);
  276.     cal += day_end;
  277.   }
  278.  
  279.   cal += TD_end;
  280.  
  281.   //fill spaces until first day in the month
  282.   var whichmonth = -1;
  283.   var filldays = Calendar.getDay();
  284.  
  285.   Calendar.setDate(Calendar.getDate() - filldays);
  286.  
  287.   //draw six weeks loop for each day in the month
  288.   for (index=0; index < DAYS_OF_WEEK * 6; index++)
  289.   {
  290.     var month_day = Calendar.getDate();
  291.     if (month_day == 1) whichmonth += 1;
  292.  
  293.     week_day = Calendar.getDay();
  294.  
  295.     // start new row if we hit a new week
  296.     if (week_day == 0) cal += TR_end + TR_start;
  297.  
  298.     var ent = null;
  299.     var lent = null;
  300.     querystr = 'event[date[(number(@year)="'+year+'" || not(@year)) && (number(@month)="'+(month+1)+'" || not(@month)) && number(@day)="'+month_day+'"]]';
  301.     if (ents)
  302.       ent = ents.selectSingleNode(querystr);
  303.     if (lents)
  304.       lent = lents.selectSingleNode(querystr);
  305.  
  306.  
  307.     var highlight = false;
  308.     if( weekday>=0 && Today.getDate()==month_day)
  309.       highlight = true;
  310.  
  311.     // highlight appropriately
  312.     if (whichmonth != 0)
  313.       cal += gray_start(Calendar.getTime()) + month_day + gray_end;
  314.     else
  315.     {
  316.       if (highlight && ent)
  317.         cal += todayevent_start(Calendar.getTime(), ent.getAttribute("name"));
  318.       else
  319.         if (highlight)
  320.           cal += today_start(Calendar.getTime());
  321.         else
  322.           if (ent)
  323.             cal += eventday_start(Calendar.getTime(), ent.getAttribute("name"));
  324.           else
  325.             if (lent)
  326.               cal += eventday_start(Calendar.getTime(), lent.getAttribute("name"));
  327.             else
  328.               cal += TD_start(Calendar.getTime());
  329.  
  330.       cal += month_day;
  331.  
  332.       if (highlight && ent)
  333.         cal += todayevent_end;
  334.       else
  335.         if (highlight)
  336.           cal += today_end;
  337.         else
  338.           if (ent)
  339.             cal += eventday_end;
  340.           else
  341.             cal += TD_end;
  342.     }
  343.  
  344.     //advance the date for next iteration
  345.     Calendar.setDate(Calendar.getDate()+1);
  346.  
  347.   }// end for loop
  348.  
  349.   cal += TR_end;
  350.  
  351.   //reset back the calendar's month
  352.   Calendar.setMonth(Calendar.getMonth()-1);
  353.   cal += '</table>'
  354.   cal += '</td></tr></table>';
  355.  
  356.   //return the html string
  357.   return cal;
  358. }
  359.  
  360.